﻿###########################################
#
#  Grad School Simulator 2014
#
#  "Welcome to the sunless depths of my ennui."
#
###########################################

: main
	hires
	draw-background
	loop
		do-behavior
	again

: do-behavior
	# by AND masking an 8 bit value with 0b1110
	# we can create the numbers 0,2,4,8,10,12,14,16:
	v0 := random 0b1110
	jump0 behavior-table

: behavior-table
	# this is a jump table. Each entry
	# is 1 instruction long, or 2 bytes:
	jump blink
	jump blink
	jump idle
	jump idle
	jump grimace
	jump show-icon
	jump show-icon
	jump show-icon

# here I've overlapped two subroutines,
# since they share the same ending instructions:
: blink
	blink-toggle
	vf := 10 wait
	blink-toggle
: idle
	vf := 45 wait
;

: blink-toggle
	i := blink-mask
	v0 := 55
	v1 := 26
	sprite v0 v1 3
	v0 := 65
	v1 := 26
	sprite v0 v1 3
;

: wait
	# takes a time argument in vf.
	# vf gets destroyed by +/-/>>/<</sprite
	# so we can freely use it as a temp value.
	delay := vf
	loop
		vf := delay
		if vf != 0 then
	again
;

: grimace
	i := grimace-mask
	v0 := 59
	v1 := 37
	sprite v0 v1 1
	jump idle

: blink-mask
	# this is carefully designed to xor with
	# the base image and toggle eye blinks:
	0x60 0x60 0xF0

: grimace-mask
	# same idea as blink-mask:
	0x1C
	

: show-icon
	icon-setup
	draw-icon
	v1 += -1
	draw-icon
	v1 += 1
	draw-icon
	v1 += -1
	draw-icon
	jump idle

: draw-icon
	sprite v1 v2 0
	vf := 10 wait
	sprite v1 v2 0
;

: icon-setup
	# by AND masking an 8 bit value with 0b11000
	# we can create the numbers 0, 8, 16 or 24:
	v0 := random 0b11000
	jump0 icon-setup-table

: icon-setup-table
	# this is a jump table. Each entry
	# is 4 instructions long, or 8 bytes:
	v1 := 27 v2 := 16 i := hungry ;
	v1 := 27 v2 := 16 i := cold   ;
	v1 := 80 v2 := 16 i := tired  ;
	v1 := 80 v2 := 16 i := busy   ;

: hungry # (left side)
	0x1F 0x20 0x20 0xD8 0x50 0x06 0xC0 0x02
	0x95 0x24 0x95 0x62 0x9F 0x64 0x4E 0x63
	0x84 0x21 0x84 0x22 0xC4 0x24 0x84 0x24
	0x81 0x02 0x58 0xD2 0x27 0x24 0x00 0x38 
: cold # (left side)
	0x3F 0xE0 0x40 0x10 0x8C 0x68 0x92 0x08
	0x92 0x68 0x92 0x08 0x92 0x68 0x92 0x08
	0x92 0x68 0x92 0x08 0xA1 0x68 0xBF 0x08
	0xBF 0x08 0x9E 0x07 0x40 0x02 0x3F 0xFC 
: tired # (right side)
	0x3F 0x80 0x40 0x4C 0xBF 0x2A 0x9F 0x24
	0x46 0x10 0x4C 0x0C 0x9F 0x02 0xBF 0x02
	0x80 0x79 0x84 0x31 0xA0 0x61 0x82 0xF9
	0x40 0x02 0x26 0x3C 0x29 0xC0 0x70 0x00 
: busy # (right side)
	0x0F 0xE0 0x30 0x10 0x47 0x88 0x47 0x84
	0x88 0x44 0x91 0x24 0x91 0x24 0x97 0x24
	0x90 0x24 0x88 0x44 0x47 0x88 0x47 0x88
	0x20 0x10 0x27 0xE0 0x28 0x00 0x70 0x00 

: draw-background
	i  := background
	v0 := 1 # sprite stride
	v1 := 0 # sprite x
	v2 := 0 # sprite y
	loop
		# I could draw this in larger chunks by packing
		# the data different, but I like vertical wipes:
		sprite v1 v2 1
		i  += v0
		v1 += 8
		if v1 == 128 then v2 += 1
		if v1 == 128 then v1 := 0
		if v2 !=  64 then
	again
;

: background
	# in SuperChip high resolution drawing mode,
	# a full-screen bitmap chews up an entire kilobyte-
	# nearly a third of my total memory budget! :S

	#	BufferedImage i = ImageIO.read(new File("background.png"));
	#   int b = 0;
	#	for(int y = 0; y < 64; y++) {
	#		for(int x = 0; x < 128; x++) {
	#			// mask out bits based on the alpha channel:
	#			b = (b<<1) | ((i.getRGB(x,y)>>>24) != 0?1:0);
	#			if ((x % 8) != 7) { continue; }
	#			System.out.format("0x%02X ", b);
	#			b = 0;
	#		}
	#		System.out.println();
	#	}

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x7C 0x00 0x00 0x00 0x78 0x00 0x00 0x00 0x07 0x80 0x00 0x00 0x00 0x00 0x00 
0x00 0xFE 0x00 0x00 0x00 0xFC 0x06 0x00 0x00 0x0F 0xD8 0x00 0x00 0x00 0x00 0x00 
0x01 0xC6 0x00 0x00 0x00 0xCC 0x06 0x00 0x06 0x0C 0xD8 0x00 0x0C 0x00 0x00 0x00 
0x01 0x86 0x00 0x00 0xE0 0xC0 0x0C 0x00 0x06 0x0C 0x00 0x00 0x0C 0x03 0x00 0x00 
0x03 0x80 0xE3 0xC0 0xC0 0xE1 0x8E 0x18 0xCC 0x0E 0x37 0x66 0xD9 0xE3 0x31 0xC0 
0x03 0x3C 0xF0 0xE7 0xC0 0x73 0xDF 0x3D 0xEC 0x07 0x37 0xF6 0xD8 0x7F 0xF9 0xE0 
0x03 0x3D 0xB7 0xEB 0x80 0x37 0x1B 0x2D 0x78 0x03 0x6D 0x6C 0xB3 0xF6 0x5B 0x60 
0x03 0x19 0xBC 0xDB 0x83 0x36 0x3B 0x6F 0x78 0x33 0x6D 0x6D 0xB6 0x66 0xDB 0x60 
0x03 0xFB 0x0F 0xDF 0x03 0xF7 0xB6 0x7B 0xD8 0x3F 0xD8 0xCD 0xB7 0xEC 0xF6 0x00 
0x01 0xF3 0x07 0x8F 0x01 0xE3 0x37 0x31 0x9C 0x1E 0xD8 0xCF 0x3B 0xCE 0xE6 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xE4 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x03 0xFF 0xF8 0x20 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x07 0xFF 0xFF 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x07 0xFF 0xFF 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x1F 0xFF 0xFF 0x80 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x3F 0xFF 0xFF 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x7F 0xFF 0xFF 0xE0 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0xBC 0xFF 0x87 0xF0 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x7C 0x3F 0xE7 0xF0 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x78 0x03 0xE3 0xB0 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x78 0x00 0x03 0xA0 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x78 0x09 0x03 0x80 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0xF1 0xF1 0xFF 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xF0 0xFE 0x80 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0xDC 0xDF 0xB2 0x80 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x5C 0xD0 0xB2 0x80 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x54 0x10 0x82 0x80 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x74 0x30 0xC3 0x80 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x37 0xF0 0xFF 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x11 0xD0 0xBA 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x08 0x10 0x82 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x08 0x0F 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x03 0xFC 0x00 0x07 0x80 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x06 0xAA 0x00 0x06 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x0D 0x55 0x1C 0x0D 0x60 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x1A 0xAF 0xC0 0x3A 0xB0 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x1D 0x7F 0x7F 0xFD 0x70 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x3A 0xFA 0x31 0xFE 0xB8 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x35 0xD0 0x5F 0x57 0x58 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x2B 0xA4 0x20 0x83 0xA8 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x75 0x00 0x1F 0x0B 0x5C 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x6B 0xA0 0x0E 0x02 0xAC 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x77 0x00 0x04 0x00 0xDC 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x6A 0x00 0x00 0x01 0xAC 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0xF7 0x00 0x00 0x00 0x5E 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0xEC 0x00 0x00 0x00 0xFE 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0xF4 0x02 0x00 0x00 0x3E 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0xF9 0xC0 0x00 0x0D 0xDE 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0xFE 0x30 0x00 0x12 0x36 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0xF8 0x50 0x00 0x53 0x9E 0x00 0x00 0x00 0x00 0x00 0x00 
0xFF 0xFF 0xFF 0xFF 0xFF 0xE0 0xC9 0x00 0x24 0x43 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 
0x00 0x00 0x84 0x00 0x00 0xD9 0x48 0x01 0x24 0xC0 0x80 0x00 0x10 0x00 0x00 0x00 
0x00 0x20 0x00 0x03 0xC1 0xB3 0x24 0x00 0x29 0x22 0x40 0x60 0x00 0x80 0x00 0x04 
0x00 0x00 0x00 0x04 0x21 0x76 0xA7 0xFF 0xF2 0x31 0xA0 0x00 0x00 0x00 0x00 0x40 
0x00 0x00 0x7F 0xFB 0x1F 0xFE 0x9D 0x99 0x9E 0xF8 0xFF 0xFF 0xF0 0x00 0x00 0x00 
0x55 0x55 0x80 0xDA 0xB8 0x7E 0x7A 0x66 0x67 0xFF 0xE0 0x08 0x0E 0xAA 0xAA 0xAA 
0xFF 0xFE 0x61 0x17 0xF0 0xF5 0x9D 0x99 0x99 0xB4 0x07 0xFE 0x7B 0xFF 0xFF 0xFF 
0xFF 0xF8 0x32 0x20 0x01 0x08 0x00 0x00 0x00 0x02 0x78 0x01 0x8C 0xFF 0xFF 0xFF 
0xFF 0xE1 0x04 0x20 0x06 0x47 0xFF 0xFF 0xFF 0xFC 0x23 0xFC 0xE3 0x3F 0xFF 0xFF 
0xFF 0x80 0x83 0xFF 0xF9 0xC0 0x14 0x00 0x08 0x00 0x18 0x00 0x19 0x0F 0xFF 0xFF 
0xFF 0xF8 0x00 0x04 0x03 0x80 0x28 0x07 0xFF 0xE2 0x04 0xBF 0x8E 0xDF 0xFF 0xFF
